package com.排序.练习题;

import java.util.ArrayList;
import java.util.Arrays;

public class Leetcode164 {
    /**
     * 最大间距
     * 给定一个无序的数组 nums，返回 数组在排序之后，相邻元素之间最大的差值 。
     * 如果数组元素个数小于 2，则返回 0 。
     * 您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法
     *
     * 示例 1:
     * 输入: nums = [3,6,9,1]
     * 输出: 3
     * 解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。。
     */
    public int maximumGap(int[] nums) {
        if (nums.length < 2) {
            return 0;
        }

        int max = nums[0];
        for (int i = 1; i < nums.length; i++) {
            max = Math.max(max, nums[i]);
        }

        ArrayList<Integer>[] buckets = new ArrayList[10];
        for (int i = 0; i < buckets.length; i++) {
            buckets[i] = new ArrayList<>();
        }

        long exp = 1;
        while (max >= exp){
            for (int j : nums){
                buckets[(j / (int)exp) % 10].add(j);
            }
            int k = 0;
            for (ArrayList<Integer> bucket : buckets) {
                for (Integer i : bucket) {
                    nums[k++] = i;
                }
                bucket.clear();
            }
            exp *= 10;
        }
        int r = 0;
        for (int i = 1; i < nums.length; i++) {
            r = Math.max(r, nums[i] - nums[i - 1]);
        }
        return r;
    }
}
